home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / zsh-3.0-p / zsh-3 / zsh-3.0-pre3 / Src / compat.c < prev    next >
C/C++ Source or Header  |  1996-06-28  |  4KB  |  186 lines

  1. /*
  2.  * $Id: compat.c,v 2.1 1996/06/28 02:05:24 hzoli Exp $
  3.  *
  4.  * compat.c - compatibiltiy routines for the deprived
  5.  *
  6.  * This file is part of zsh, the Z shell.
  7.  *
  8.  * Copyright (c) 1992-1996 Paul Falstad
  9.  * All rights reserved.
  10.  *
  11.  * Permission is hereby granted, without written agreement and without
  12.  * license or royalty fees, to use, copy, modify, and distribute this
  13.  * software and its documentation for any purpose, provided that the
  14.  * above copyright notice and the following two paragraphs appear in
  15.  * all copies of this software.
  16.  *
  17.  * In no event shall Paul Falstad or the Zsh Development Group be liable
  18.  * to any party for direct, indirect, special, incidental, or consequential
  19.  * damages arising out of the use of this software and its documentation,
  20.  * even if Paul Falstad and the Zsh Development Group have been advised of
  21.  * the possibility of such damage.
  22.  *
  23.  * Paul Falstad and the Zsh Development Group specifically disclaim any
  24.  * warranties, including, but not limited to, the implied warranties of
  25.  * merchantability and fitness for a particular purpose.  The software
  26.  * provided hereunder is on an "as is" basis, and Paul Falstad and the
  27.  * Zsh Development Group have no obligation to provide maintenance,
  28.  * support, updates, enhancements, or modifications.
  29.  *
  30.  */
  31.  
  32. #include "zsh.h"
  33.  
  34. /* Return pointer to first occurence of string t *
  35.  * in string s.  Return NULL if not present.     */
  36.  
  37. #ifndef HAVE_STRSTR
  38. char *
  39. strstr(const char *s, const char *t)
  40. {
  41.     char *p1, *p2;
  42.  
  43.     for (; *s; s++) {
  44.         for (p1 = s, p2 = t; *p2; p1++, p2++)
  45.             if (*p1 != *p2)
  46.                 break;
  47.         if (!*p2)
  48.             return (char *)s;
  49.     }
  50.     return NULL;
  51. }
  52. #endif
  53.  
  54.  
  55. #ifndef HAVE_GETHOSTNAME
  56. int
  57. gethostname(char *name, int namelen)
  58. {
  59.     struct utsname uname_str;
  60.  
  61.     uname(&uname_str);
  62.     strncpy(hostnam, uname_str.nodename, 256);
  63.     return 0;
  64. }
  65. #endif
  66.  
  67.  
  68. #ifndef HAVE_GETTIMEOFDAY
  69. void
  70. gettimeofday(struct timeval *tv, struct timezone *tz)
  71. {
  72.     tv->tv_usec = 0;
  73.     tv->tv_sec = (long)time((time_t) 0);
  74. }
  75. #endif
  76.  
  77.  
  78. /* compute the difference between two calendar times */
  79.  
  80. #ifndef HAVE_DIFFTIME
  81. double
  82. difftime(time_t t2, time_t t1)
  83. {
  84.     return ((double)t2 - (double)t1);
  85. }
  86. #endif
  87.  
  88.  
  89. #ifndef HAVE_STRERROR
  90. extern char *sys_errlist[];
  91.  
  92. /* Get error message string associated with a particular  *
  93.  * error number, and returns a pointer to that string.    *
  94.  * This is not a particularly robust version of strerror. */
  95.  
  96. char *
  97. strerror(int errnum)
  98. {
  99.     return (sys_errlist[errnum]);
  100. }
  101. #endif
  102.  
  103.  
  104. /* This function will be changed to work the same way *
  105.  * as POSIX getcwd.  Then I'll use the system getcwd  *
  106.  * if configure finds one.                            */
  107.  
  108. /**/
  109. char *
  110. zgetcwd(void)
  111. {
  112.     static char buf0[PATH_MAX];
  113.     char *buf2 = buf0 + 1;
  114.     char buf3[PATH_MAX];
  115.     struct stat sbuf;
  116.     struct dirent *de;
  117.     DIR *dir;
  118.     ino_t ino, rootino = (ino_t) ~ 0;
  119.     dev_t dev, rootdev = (dev_t) ~ 0;
  120.  
  121.     holdintr();
  122.     buf2[0] = '\0';
  123.     buf0[0] = '/';
  124.  
  125.     if (stat(buf0, &sbuf) >= 0) {
  126.     rootino = sbuf.st_ino;
  127.     rootdev = sbuf.st_dev;
  128.     }
  129.  
  130.     for (;;) {
  131.     if (stat(".", &sbuf) < 0) {
  132.         chdir(buf0);
  133.         noholdintr();
  134.         return ztrdup(".");
  135.     }
  136.     ino = sbuf.st_ino;
  137.     dev = sbuf.st_dev;
  138.     if (stat("..", &sbuf) < 0) {
  139.         chdir(buf0);
  140.         noholdintr();
  141.         return ztrdup(".");
  142.     }
  143.     if ((sbuf.st_ino == ino && sbuf.st_dev == dev) ||
  144.         (ino == rootino && dev == rootdev)) {
  145.         chdir(buf0);
  146.         noholdintr();
  147.         return ztrdup(buf0);
  148.     }
  149.     dir = opendir("..");
  150.     if (!dir) {
  151.         chdir(buf0);
  152.         noholdintr();
  153.         return ztrdup(".");
  154.     }
  155.     chdir("..");
  156.     readdir(dir);
  157.     readdir(dir);
  158.     while ((de = readdir(dir)))
  159.         if (de->d_ino == ino) {
  160.         lstat(de->d_name, &sbuf);
  161.         if (sbuf.st_dev == dev)
  162.             goto match;
  163.         }
  164.     closedir(dir);
  165.     dir = opendir(".");
  166.     readdir(dir);
  167.     readdir(dir);
  168.     while ((de = readdir(dir))) {
  169.         lstat(de->d_name, &sbuf);
  170.         if (sbuf.st_dev == dev)
  171.         goto match;
  172.     }
  173.     noholdintr();
  174.     closedir(dir);
  175.     return ztrdup(".");
  176.       match:
  177.     strcpy(buf3, de->d_name);
  178.     if (*buf2)
  179.         strcat(buf3, "/");
  180.     strcat(buf3, buf2);
  181.     strcpy(buf2, buf3);
  182.     closedir(dir);
  183.     }
  184. }
  185.  
  186.